﻿#region - 版 本 注 释 -
/*----------------------------------------------------------------
 * 版权所有 (c) 2025   保留所有权利。
 * CLR版本：4.0.30319.42000
 * 机器名称：DESKTOP-GLJ2Q8J
 * 公司名称：
 * 命名空间：AutoCAD.EntityTools
 * 唯一标识：5c4a524c-6572-4de8-9003-96ad81ac2b8d
 * 文件名：DoubleTools
 * 当前用户域：DESKTOP-GLJ2Q8J
 * 
 * 创建者：Guoweihao-79991
 * 电子邮箱：799919859@qq.com
 * 创建时间：2025/5/23 16:29:38
 * 版本：V1.0.0
 *
 * 功能描述(Description):
 * 参考文档(Reference):
 * 数据表(Tables):
 * 作者(Author):Guo
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion - 版 本 注 释 -


namespace AutoCAD.EntityTools
{
    /// <summary>
    /// DoubleTools 的摘要说明
    /// </summary>
    public static class DoubleTools
    {
        /// <summary>
        /// 检查两个双精度浮点数是否在指定的误差范围内几乎相等
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="diff"></param>
        /// <param name="maximumAbsoluteError"></param>
        /// <returns></returns>
        public static bool AlmostEqualNorm(this double a, double b, double diff, double maximumAbsoluteError)
        {
            if (double.IsInfinity(a) || double.IsInfinity(b))
            {
                return a == b;
            }

            if (double.IsNaN(a) || double.IsNaN(b))
            {
                return false;
            }

            return Math.Abs(diff) < maximumAbsoluteError;
        }
        /// <summary>
        /// 检查两个双精度浮点数是否在指定的误差范围内几乎相等
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="maximumAbsoluteError"></param>
        /// <returns></returns>

        public static bool AlmostEqual(this double a, double b, double maximumAbsoluteError)
        {
            return a.AlmostEqualNorm(b, a - b, maximumAbsoluteError);
        }
        /// <summary>
        /// 检查双精度浮点数是否在指定的误差范围内接近零
        /// </summary>
        /// <param name="value">要检查的数值</param>
        /// <param name="epsilon">误差范围</param>
        /// <returns>如果数值在误差范围内接近零，则返回true；否则返回false</returns>
        public static bool IsZero(this double value, double epsilon)
        {
            return Math.Abs(value) < epsilon;
        }
        /// <summary>
        /// 将字符串解析为整数，如果解析失败则返回默认值
        /// </summary>
        /// <param name="input"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public static int ParseToIntOrDefault(this string input, int defaultValue = 0)
        {
            if (int.TryParse(input, out int result))
            {
                return result;
            }
            else
            {
                return defaultValue;
            }
        }
    }
}
